// 云函数入口文件
const cloud = require('wx-server-sdk')

// 云函数初始化，必须放在第一个执行
cloud.init({
  // API 调用都保持和云函数当前所在环境一致
  env: cloud.DYNAMIC_CURRENT_ENV
})

// 引入数据库实例
const db = cloud.database()
const comm = db.command
const MAX_LIMIT = 100

// 保存地址
async function save(args) {
 if(args._id) {
   // 修改
   return await db.collection("address").doc(args._id).update({
     data: args
   });
 }else {
   // 新增
    return await db.collection("address").add({
      data: args
    });
 }
}

// 查询地址列表根据openid
async function queryList(args) {
  // 先取出集合记录总数
  const countResult = await db.collection('address').where({
    openid: comm.eq(args.openid)
  }).count()
  
  const total = countResult.total
  // 计算需分几次取
  const batchTimes = Math.ceil(total / 100)
  // 承载所有读操作的 promise 的数组
  const tasks = []
  for (let i = 0; i < batchTimes; i++) {
    const promise = db.collection('address').where({
      openid: comm.eq(args.openid)
    }).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
    tasks.push(promise)
  }
  if(tasks.length === 0) {
    return {
      data: [],
      errMsg: 'ok',
    }
  }
  // 等待所有
  return (await Promise.all(tasks)).reduce((acc, cur) => {
    return {
      data: acc.data.concat(cur.data),
      errMsg: acc.errMsg,
    }
  })
}

/**
 * 获取用户第一个地址
 * @param {*} openid 用户id 
 */
async function getTopOne(args) {
  return await db.collection("address").where({
    openid: comm.eq(args.openid)
  }).limit(1).get();
}

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()
  const {method, args} = event;
  args.openid = wxContext.OPENID;
  let res = null;
  if(method === "save") {
    res = await save(args);
  }else if(method === "queryList") {
    res = await queryList(args);
  }else if(method === "getTopOne") {
    res = await getTopOne(args);
  }
  return {
    rstData: res,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  }
}